|
Date : 15/4/94 Protection : MOT DE PASSE Programme : STARLORD (VF) Outils : SOFT-ICE V2.50 Fichier : Temps pass� : 15mn Soci�t� : Microprose Origine : C.D. Divers : Num�ro : 9 Pas trop difficile � cracker, le plus difficile ayant �t� de lib�rer assez de m�moire pour pouvoir lancer SOFT-ICE en m�me temps que le jeu (en mettant BUFFERS = 5, j'ai lib�r� une quantit� suffisante de m�moire pour le faire). La routine de code est relativement courte, et en prenant du recul, on trouve le CALL responsable de cette routine. Juste apr�s se trouve un CMP puis un saut, saut qu'il a suffit d'inver- ser. 4DBA:09A7 7502 JNZ 09AB ; --> devient JZ 09AB C�dric ; PATCH POUR LE PROGRAMME STARLORD. ;****************************************************************************** ; ZONE A INITIALISER adr_ip1 equ 09A7h ; Adresse dont le contenu est � modifier. anc_val equ 0275h ; Valeur d'origine � rechercher, invers�e. nouv_val equ 0274h ; Nouvelle valeur (la modif). INT_DET equ 21h ; Le num�ro de l'INT que l'on veut utiliser. BEEP_TONE equ 440 ; Fr�quence de la note. nb equ 30 ; Nombre de d�pilage. ;****************************************************************************** seg_a segment byte public assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a org 100h sto proc far start: jmp init ; r�duire la m�moire et d�placer la db 90h ; pile plus pr�s. paramet dw 0 ; M�me bloc d'environnement. ENVIR dw 0 ; Les param�tres de la ligne de data_3 dw 0 ; commande sont recopi�s ici puis FCB_1 dw 0 ; transmis au programme fils. ( 80h ) data_5 dw 0 FCB_2 dw 0 data_7 dw 0 sauve_SP dw 0 sauve_SS dw 0 data_9 dw 0, 0 drap equ 0 ;------------------------------ PROGRAMME PERE ------------------------------ loc_1: mov sauve_SP,sp mov sauve_SS,ss mov ax,80h mov ENVIR,ax ; Ligne de commande... mov data_3,ds mov ax,5Ch ; Premier FCB ( inutilis� ) mov FCB_1,ax mov data_5,ds mov ax,6Ch ; Second FCB ( inutilis� ) mov FCB_2,ax mov data_7,ds mov ah,35h mov al,INT_DET int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov cs:data_9,bx mov word ptr cs:data_9+2,es mov ah,25h mov al,INT_DET lea dx,cs:[_int] ; Load effective addr int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx lea dx,cs:[nom_prg] ; Load effective addr push ds pop es lea bx,cs:[paramet] ; Load effective addr mov al,0 mov ah,4Bh int 21h ; Appel du programme fils. ; run progm @ds:dx, parm @es:bx mov sp,sauve_SP mov ss,sauve_SS cmp al,2 ; teste le code de retour du programme jnz ok ; fils, 02 si pas trouv�. mov dx,offset mess_err mov ah,9 int 21h ; Les cinq instructions suivantes sont facultatives puisque le ; vecteur d'origine est remis en place d�s que le patch est effectu�. ; Le seul but est d'�viter le plantage du PC dans l'hypoth�se o� l'on ; lance le programme p�re et que celui-ci ne trouve pas le programme ; fils. A ce moment l� on remet tout en place et on quitte. ok: mov ah,25h mov al,INT_DET mov dx,cs:data_9 mov ds,word ptr cs:data_9+2 int 21h mov ah,4Ch int 21h ; terminate with al=return code sto endp ;---------------------------- int d�tourn�e -------------------------------- int_entry proc far _int: jmp apres _SAUVE_SP dw 0,0 apres: push ax push ds push bx push cx push dx pushf ; Push flags ifdef sous_f cmp ah,sous_f jnz sort endif mov word ptr cs:[_SAUVE_SP],sp mov cx,nb prochain: pop ds dec cx jz s cmp word ptr ds:[adr_ip1],anc_val ; Si ok on patche. jnz prochain mov word ptr ds:[adr_ip1],nouv_val ; On y place le patch. xor bx,bx mov ds,bx ; L'INT 21 n'est pas r�entrante, on ne peut donc pas se servir de ; la fonction 25h ( set int. vector ) mov bx,word ptr cs:data_9 ; Je remets manuellement mov ds:[INT_DET*4],bx ; en place le vecteur mov bx,word ptr cs:data_9+2 ; de l'INT d�tourn�e. mov ds:[INT_DET*4+2],bx ;* Sound - Sounds speaker with the following tone and duration: mov al, 0B6h ; Initialize channel 2 of out 43h, al ; timer chip mov dx, 12h ; Divide 1,193,180 hertz mov ax, 34DCh ; (clock frequency) by mov bx, BEEP_TONE ; desired frequency div bx ; Result is timer clock count out 42h, al ; Low byte of count to timer mov al, ah out 42h, al ; High byte of count to timer mov bx,3 ; Charge BX avec 3 BEEPs main_b: in al, 61h ; Read value from port 61h or al, 3 ; Set first two bits out 61h, al ; Turn speaker on mov dx,3 rebou: mov cx, 0ffffh bou: loopnz bou dec dx jnz rebou in al, 61h ; When time elapses, get port value xor al, 3 ; Kill bits 0-1 to turn out 61h, al ; speaker off dec cx bou1: loopnz bou1 dec bx ; Compteur de boucle. jnz main_b ; Trois bips... s: mov sp,word ptr cs:[_SAUVE_SP] sort: popf pop dx pop cx pop bx pop ds pop ax jmp dword ptr cs:data_9 int_entry endp ;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------ init: ; D�codage du texte. cld ; Pour incr�menter SI et DI. xor ax,ax mov si,offset chaine ; pointe sur le d�but de la chaine. mov di,si ; DI �galement. mov cx,offset chaine_fin - offset chaine ; 28 lignes de 6 caract�res sont XOR�s. ; + mess_err ( 30 ) + nom_prog ( 13 ). toto: lodsb ; On cherche... xor al,ah ; On XOR. stosb ; On remet. xchg ah,al loop toto ; Et on tourne tant que CX # 0. mov ax,1a00h ; Test si carte + moniteur VGA int 10h cmp al,1ah je graf ; Si oui on affiche la fen�tre FREDDY_SOFT. mov ah,12h ; Test EGA. INT 10 sf 12 ssf 10 mov bl,10h mov bh,0ffh int 10h cmp bh,0ffh ; Si # de 0ffh on a une carte EGA ou... jnz graf ; mieux ! suite1: mov ah,4ah mov bx,offset fin ; Fin du programme en BX. mov cl,4 ; Divis� par 4 pour avoir des paragraphes. shr bx,cl inc bx ; On en rajoute un par s�curit�. int 21h ; Execution de la fonction 4Ah. mov sp,offset fin ; on d�place la pile en "fin" car elle est jmp loc_1 ; plac�e en FFFE dans un programme COM. graf: ; Raz de l'�cran mov ax,3 int 10h mov ax,1301h ; Mode 01 attribut couleur dans BL. mov bx,004bh ; Page 0. mov cx,28 ; nombre de char. mov dx,0a19h ; ligne,colonne. lea bp,cs:[chaine] ligne_suiv: int 10h inc dh add bp,28 cmp dh,10h ; 6 lignes de 28 caract�res. jb ligne_suiv mov ah,2 ; Pour faire disparaitre le curseur. xor bh,bh ; Page ecran 0. mov dh,25 int 10h xor ah,ah int 16h ; Attend un char... mov cx,30 ; Attend le retour ligne... vibre: mov dx,3dah in1: in al,dx test al,8 jnz in1 in2: in al,dx test al,8 jz in2 cli ; D�cale d'un pixel. mov dx,3c0h mov al,33h out dx,al mov al,2 out dx,al sti mov dx,3dah in3: in al,dx test al,8 jnz in3 in4: in al,dx test al,8 jz in4 cli ; D�cale d'un pixel. mov dx,3c0h mov al,33h out dx,al mov al,0ffh out dx,al sti dec cx jnz vibre jmp suite1 db 55h,0aah ; Identificateur de d�but. chaine: db '�����������CEDRIC���������Ŀ' db '� �' db '� STARLORD Bypass �' db "� I hope you'll enjoy it �" db '� �' db '��� Lan�eur Crypt� V1.1 ����' mess_err db 0ah,0dh,'Programme enfant non trouv�','$' nom_prg db 'super.exe',0,0,0,0 ; 12 car max + nul chaine_fin: db 0aah,55h ; Identificateur de fin. fin_init label near ;----------------------- PLACE RESERVEE POUR LA PILE ------------------------ dw 100 dup (' ') fin equ this byte ; ici le sommet de la pile, SP. seg_a ends end start |